home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 001 / pibt40s2.arc / PIBDIALC.MOD < prev    next >
Text File  |  1987-08-07  |  34KB  |  979 lines

  1. (*----------------------------------------------------------------------*)
  2. (*  Signal_Connection -- indicate connection made for redial, list dial *)
  3. (*----------------------------------------------------------------------*)
  4.  
  5. PROCEDURE Signal_Connection;
  6.  
  7. (*----------------------------------------------------------------------*)
  8. (*                                                                      *)
  9. (*     Procedure:  Signal_Connection                                    *)
  10. (*                                                                      *)
  11. (*     Purpose:    Indicates connection made                            *)
  12. (*                                                                      *)
  13. (*     Calling Sequence:                                                *)
  14. (*                                                                      *)
  15. (*        Signal_Connection;                                            *)
  16. (*                                                                      *)
  17. (*     Calls:   Save_Screen                                             *)
  18. (*              Restore_Screen                                          *)
  19. (*              Draw_Menu_Frame                                         *)
  20. (*              Reset_Global_Colors                                     *)
  21. (*              Dialer_Carrier_Detect                                   *)
  22. (*              Read_Kbd                                                *)
  23. (*                                                                      *)
  24. (*----------------------------------------------------------------------*)
  25.  
  26. VAR
  27.    Local_Save : Saved_Screen_Ptr;
  28.    Ch         : CHAR;
  29.  
  30. BEGIN (* Signal_Connection *)
  31.  
  32.    Save_Partial_Screen( Local_Save, 10, 10, 60, 14 );
  33.    Draw_Menu_Frame( 10, 10, 60, 14, Menu_Frame_Color,
  34.                     Menu_Title_Color + Blink,
  35.                     Menu_Text_Color, '' );
  36.  
  37.    TextColor( Menu_Text_Color + Blink );
  38.  
  39.    WRITELN('Connection established!!');
  40.    WRITE  ('Hit ESC key to continue');
  41.  
  42.    REPEAT
  43.       Menu_Beep;
  44.       DELAY( 3 * Tenth_Of_A_Second_Delay );
  45.    UNTIL ( KeyPressed  OR  ( NOT Dialer_Carrier_Detect ) );
  46.  
  47.    IF KeyPressed THEN
  48.       BEGIN
  49.          Read_Kbd( Ch );
  50.          IF ( Ch = CHR( ESC ) ) AND KeyPressed THEN
  51.             READ( Kbd, Ch );
  52.       END;
  53.  
  54.    Restore_Screen( Local_Save );
  55.    Reset_Global_Colors;
  56.  
  57. END   (* Signal_Connection *);
  58.  
  59. (*----------------------------------------------------------------------*)
  60. (*                  Dial_A_Number --- dial phone number                 *)
  61. (*----------------------------------------------------------------------*)
  62.  
  63. PROCEDURE Dial_A_Number(     Re_Dial : BOOLEAN;
  64.                          VAR Quit    : BOOLEAN );
  65.  
  66. (*----------------------------------------------------------------------*)
  67. (*                                                                      *)
  68. (*     Procedure:  Dial_A_Number                                        *)
  69. (*                                                                      *)
  70. (*     Purpose:    Dials phone number                                   *)
  71. (*                                                                      *)
  72. (*     Calling Sequence:                                                *)
  73. (*                                                                      *)
  74. (*        Dial_A_Number(     Re_Dial : BOOLEAN;                         *)
  75. (*                       VAR Quit    : BOOLEAN );                       *)
  76. (*                                                                      *)
  77. (*           Re_Dial --- TRUE to re-dial last number                    *)
  78. (*           Quit    --- TRUE if Esc key hit to stop dialing            *)
  79. (*                                                                      *)
  80. (*     Calls:   Send_Modem_Command                                      *)
  81. (*              Save_Screen                                             *)
  82. (*              Restore_Screen                                          *)
  83. (*              Draw_Menu_Frame                                         *)
  84. (*              Reset_Global_Colors                                     *)
  85. (*              Dialer_Carrier_Detect                                   *)
  86. (*              Display_Phone_Numbers                                   *)
  87. (*              TimeOfDay                                               *)
  88. (*              TimeDiff                                                *)
  89. (*                                                                      *)
  90. (*----------------------------------------------------------------------*)
  91.  
  92. VAR
  93.    Dial_Title   : ShortStr;
  94.    OK_Redial    : BOOLEAN;
  95.    Ch           : CHAR;
  96.    Timed_Out    : BOOLEAN;
  97.    STimer       : REAL;
  98.    Modem_Mess   : AnyStr;
  99.    New_Baud     : INTEGER;
  100.    Ierr         : INTEGER;
  101.    Qerr         : BOOLEAN;
  102.    SNumber      : STRING[100];
  103.    Inumber      : INTEGER;
  104.    Modem_Buzy   : BOOLEAN;
  105.    Modem_NoC    : BOOLEAN;
  106.    Modem_Conn   : BOOLEAN;
  107.    T            : REAL;
  108.    TOD          : REAL;
  109.    IY           : INTEGER;
  110.    I            : INTEGER;
  111.    J            : INTEGER;
  112.    TS           : STRING[9];
  113.    TSO          : STRING[9];
  114.    ESC_Hit      : BOOLEAN;
  115.    Local_Save_3 : Saved_Screen_Ptr;
  116.    Local_Save_5 : Saved_Screen_Ptr;
  117.    Got_Num      : BOOLEAN;
  118.    CR_Str       : STRING[1];
  119.    Do_Baud      : BOOLEAN;
  120.  
  121. (*----------------------------------------------------------------------*)
  122. (*  Convert_Entry_To_Number --- convert dialing entry to phone number   *)
  123. (*----------------------------------------------------------------------*)
  124.  
  125. PROCEDURE Convert_Entry_To_Number;
  126.  
  127. BEGIN (* Convert_Entry_To_Number *)
  128.  
  129.                                    (* Check for manual dial *)
  130.  
  131.    IF UpCase( SNumber[1] ) = 'M' THEN
  132.       BEGIN
  133.          Manual_Dial := TRUE;
  134.          IF LENGTH( SNumber ) > 1 THEN
  135.             SNumber     := COPY( SNumber, 2, LENGTH( SNumber ) - 1 )
  136.          ELSE
  137.             SNumber     := '';
  138.       END;
  139.                                    (* Check for prefix *)
  140.  
  141.    IF SNumber[1] IN ['+','-','!','@','#'] THEN
  142.       BEGIN
  143.          Prefix_Str := Phone_Prefix_Nos[ POS( SNumber[1], '+-!@#' ) ];
  144.          IF LENGTH( SNumber ) > 1 THEN
  145.             SNumber    := COPY( SNumber, 2, LENGTH( SNumber ) - 1 )
  146.          ELSE
  147.             SNumber     := '';
  148.       END;
  149.  
  150.    IF SNumber[LENGTH(SNumber)] IN ['+','-','!','@','#'] THEN
  151.       BEGIN
  152.          Postfix_Str := Phone_Prefix_Nos[ POS( SNumber[LENGTH(SNumber)],
  153.                                                '+-!@#' ) ];
  154.          IF LENGTH( SNumber ) > 1 THEN
  155.             SNumber    := COPY( SNumber, 1, ( LENGTH( SNumber ) - 1 ) )
  156.          ELSE
  157.             SNumber     := '';
  158.       END;
  159.  
  160.    IF Manual_Dial THEN
  161.       BEGIN
  162.          Phone_Number       := SNumber;
  163.          Phone_Entry_Number := -1;
  164.          FOR I := 1 TO 25 DO
  165.             Phone_Entry_Data.Phone_Name[I] := ' ';
  166.          FOR I := 1 TO 15 DO
  167.             Phone_Entry_Data.Phone_Number[I] := ' ';
  168.          FOR I := 1 TO 9 DO
  169.             Phone_Entry_Data.Phone_Script[I] := ' ';
  170.          J := 0;
  171.          FOR I := ( 16 - LENGTH( SNumber ) ) TO 15 DO
  172.             BEGIN
  173.                J := J + 1;
  174.                Phone_Entry_Data.Phone_Number[I] := SNumber[J];
  175.             END;
  176.       END
  177.    ELSE
  178.       BEGIN
  179.          Inumber := 2;
  180.          VAL( SNumber, Inumber, Ierr );
  181.          IF ( Ierr = 0 ) AND
  182.             ( INumber >  0 ) AND
  183.             ( INumber <= Dialing_Dir_Size) THEN
  184.             BEGIN
  185.                Phone_Entry_Data   := Dialing_Directory^[ INumber ];
  186.                Phone_Number       := Phone_Entry_Data.Phone_Number;
  187.                Phone_Entry_Number := INumber;
  188.                IF ( NOT Dialer_Carrier_Detect ) THEN
  189.                   Reset_Comm_Params( Phone_Entry_Data , INumber );
  190.             END
  191.          ELSE
  192.             BEGIN
  193.                WRITELN;
  194.                WRITE('Bad phone number, dialing cancelled.');
  195.                ClrEol;
  196.                DELAY( Two_Second_Delay );
  197.                Quit := TRUE;
  198.                Phone_Entry_Number := -1;
  199.             END;
  200.       END;
  201.  
  202. END   (* Convert_Entry_To_Number *);
  203.  
  204. (*----------------------------------------------------------------------*)
  205. (*            Perform_The_Dial --- perform actual dialing               *)
  206. (*----------------------------------------------------------------------*)
  207.  
  208. PROCEDURE Perform_The_Dial;
  209.  
  210. VAR
  211.    Int_Ch  : INTEGER;
  212.    CNumber : AnyStr;
  213.    I       : INTEGER;
  214.    ConMess : AnyStr;
  215.  
  216. (*----------------------------------------------------------------------*)
  217.  
  218. PROCEDURE Append_A_Char(  VAR  S: AnyStr;
  219.                               Ch: CHAR    );
  220.  
  221. VAR
  222.    L: INTEGER;
  223.  
  224. BEGIN (* Append_A_Char *)
  225.  
  226.    L := ORD( S[0] );
  227.  
  228.    IF ( L < 255 ) THEN
  229.       BEGIN
  230.          L    := L + 1;
  231.          S[L] := Ch;
  232.          S[0] := CHR( L );
  233.       END
  234.    ELSE
  235.       BEGIN
  236.          MOVE( S[2], S[1], 254 );
  237.          S[255] := Ch;
  238.       END;
  239.  
  240. END   (* Append_A_Char *);
  241.  
  242. (*----------------------------------------------------------------------*)
  243.  
  244. PROCEDURE Do_Baud_Detection;
  245.  
  246. CONST
  247.    Baud_Rates: ARRAY[ 1 .. 9 ] OF INTEGER
  248.                = ( 110, 150, 300, 600, 1200, 2400, 4800, 9600, 19200 );
  249.  
  250. VAR
  251.    I: INTEGER;
  252.  
  253. BEGIN (* Do_Baud_Detection *)
  254.  
  255.    STimer     := TimeOfDay;
  256.    IY         := 0;
  257.                                    (* Wait for connect message *)
  258.    REPEAT
  259.  
  260.       Async_Receive_With_TimeOut( One_Second , Int_Ch );
  261.  
  262.       IF ( Int_Ch <> TimeOut ) THEN
  263.          Append_A_Char( Modem_Mess , CHR( Int_Ch ) );
  264.  
  265.       Timed_Out := ( TimeDiff( Stimer , TimeOfDay ) > 5.0 ) OR
  266.                    ( Int_Ch = TimeOut );
  267.  
  268.       IY     := POS( Modem_Connect , Modem_Mess );
  269.  
  270.    UNTIL( Timed_Out OR ( IY > 0 ) );
  271.  
  272.                                    (* If connect found, read chars *)
  273.                                    (* up to next CR, if any.       *)
  274.    IF ( IY > 0 ) THEN
  275.       BEGIN
  276.  
  277.          DELETE( Modem_Mess, 1, IY - 1 );
  278.  
  279.          REPEAT
  280.  
  281.             Async_Receive_With_TimeOut( One_Second , Int_Ch );
  282.  
  283.             IF ( Int_Ch <> TimeOut ) THEN
  284.                Append_A_Char( Modem_Mess , CHR( Int_Ch ) );
  285.  
  286.             Timed_Out := ( Int_Ch = TimeOut );
  287.  
  288.          UNTIL( Timed_Out OR ( Int_Ch = CR ) );
  289.  
  290.       END;
  291.  
  292.                                    (* If connect message found, look for *)
  293.                                    (* any following digits, indicating   *)
  294.                                    (* baud rate of connection.           *)
  295.  
  296.    IY     := POS( Modem_Connect , Modem_Mess );
  297.  
  298.    IF ( IY > 0 ) THEN
  299.       BEGIN
  300.  
  301.          I             := IY + LENGTH( Modem_Connect );
  302.  
  303.          Append_A_Char( Modem_Mess , CHR( CR ) );
  304.  
  305.          New_Baud      := 0;
  306.          Do_Baud       := TRUE;
  307.  
  308.          WHILE( Do_Baud ) DO
  309.             BEGIN
  310.                IF Modem_Mess[I] IN ['0'..'9'] THEN
  311.                   New_Baud := New_Baud * 10 + ORD( Modem_Mess[I] ) -
  312.                                               ORD('0')
  313.                ELSE IF Modem_Mess[I] = CHR( CR ) THEN
  314.                   Do_Baud := FALSE;
  315.                I := I + 1;
  316.                IF ( I > LENGTH( Modem_Mess ) ) THEN
  317.                   Do_Baud := FALSE;
  318.             END;
  319.  
  320.          FOR I := 1 TO 9 DO
  321.             IF ( New_Baud = Baud_Rates[I] ) THEN
  322.                BEGIN
  323.                   IF ( New_Baud <> Baud_Rate ) THEN
  324.                      BEGIN
  325.                         Reset_Comm_Port := TRUE;
  326.                         Baud_Rate       := New_Baud;
  327.                         Async_Reset_Port( Comm_Port, Baud_Rate, Parity,
  328.                                           Data_Bits, Stop_Bits );
  329.                      END;
  330.                END;
  331.  
  332.       END;
  333.  
  334. END   (* Do_Baud_Detection *);
  335.  
  336. (*----------------------------------------------------------------------*)
  337.  
  338. BEGIN (* Perform_The_Dial *)
  339.                                    (* Nothing back from modem yet *)
  340.    Modem_Mess  := '';
  341.  
  342.    IF ( LENGTH( Phone_Number ) > 0 ) AND ( NOT Quit ) THEN
  343.       BEGIN  (* Phone number gotten *)
  344.  
  345.          IF ( NOT Manual_Dial ) THEN
  346.             Dial_Title := TRIM( Dial_Title + ' ' +
  347.                                 Phone_Entry_Data.Phone_Name );
  348.  
  349.          Draw_Menu_Frame( 10, 10, 70, 17, Menu_Frame_Color, Menu_Title_Color,
  350.                           Menu_Text_Color, Dial_Title );
  351.  
  352.          GoToXY( 1 , 1 );
  353.                                    (* Purge receive to avoid *)
  354.                                    (* false modem messages   *)
  355.          Async_Purge_Buffer;
  356.                                    (* Get number to dial     *)
  357.  
  358.          CNumber := Prefix_Str + Phone_Number + Postfix_Str;
  359.  
  360.          I := POS( ' ' , CNumber );
  361.  
  362.          WHILE( I > 0 ) DO
  363.             BEGIN
  364.                DELETE( CNumber, I, 1 );
  365.                I := POS( ' ' , CNumber );
  366.             END;
  367.  
  368.          IF OK_Redial THEN
  369.             BEGIN
  370.                TextColor( Menu_Text_Color_2 );
  371.                WRITE('Re-dialing  : ');
  372.                TextColor( Menu_Text_Color );
  373.                WRITE( CNumber );
  374.             END
  375.          ELSE
  376.             BEGIN
  377.                TextColor( Menu_Text_Color_2 );
  378.                WRITE('Dialing     : ');
  379.                TextColor( Menu_Text_Color );
  380.                WRITE( CNumber );
  381.             END;
  382.  
  383.          ClrEol;
  384.  
  385.          Send_Modem_Command( Modem_Dial               +
  386.                              Prefix_Str               +
  387.                              Phone_Number             +
  388.                              Postfix_Str              +
  389.                              Modem_Dial_End );
  390.  
  391.          STimer          := TimeOfDay;
  392.          Modem_Buzy      := FALSE;
  393.          Modem_NoC       := FALSE;
  394.          Modem_Conn      := FALSE;
  395.          IY              := WhereY;
  396.          TS              := '';
  397.          Connection_Made := FALSE;
  398.  
  399.          GoToXY( 1 , 2 );
  400.          TextColor( Menu_Text_Color_2 );
  401.          WRITE('Begins at   : ');
  402.          TextColor( Menu_Text_Color );
  403.          WRITE(TimeString(TimeOfDay , Time_Format));
  404.          ClrEol;
  405.  
  406.          GoToXY( 1 , 3 );
  407.          TextColor( Menu_Text_Color_2 );
  408.          WRITE('Time now    : ');
  409.          TextColor( Menu_Text_Color );
  410.          WRITE(TimeString(TimeOfDay , Time_Format));
  411.          ClrEol;
  412.  
  413.          Write_Log( Dial_Title + ' (' + Phone_Number + ')' , FALSE, FALSE );
  414.  
  415.          GoToXY( 1 , 4 );
  416.          TextColor( Menu_Text_Color_2 );
  417.          WRITE('Elapsed time: ');
  418.          ClrEol;
  419.          TextColor( Menu_Text_Color );
  420.  
  421.          IF OK_Redial THEN
  422.             BEGIN
  423.                GoToXY( 1 , 5 );
  424.                TextColor( Menu_Text_Color_2 );
  425.                WRITE('Retry count : ');
  426.                TextColor( Menu_Text_Color );
  427.                WRITE(Redial_Count);
  428.                ClrEol;
  429.             END;
  430.  
  431.          CursorOff;
  432.  
  433.          REPEAT
  434.  
  435.             TOD       := TimeOfDay;
  436.             T         := TimeDiff( STimer , TOD );
  437.             TSO       := TS;
  438.             TS        := TimeString( T , Military_Time );
  439.  
  440.             IF TS <> TSO THEN
  441.                BEGIN
  442.                   GoToXY( 15 , 3 );
  443.                   WRITE( TimeString( TOD , Military_Time ) );
  444.                   ClrEol;
  445.                   GoToXY( 15 , 4 );
  446.                   WRITE( TS );
  447.                   ClrEol;
  448.                END;
  449.  
  450.             Timed_Out := ( T > Modem_Time_Out );
  451.  
  452.             IF Async_Receive( Ch ) THEN
  453.                Append_A_Char( Modem_Mess , Ch );
  454.  
  455.             Modem_Buzy := ( POS( Modem_Busy       , Modem_Mess ) > 0 ) AND
  456.                           ( LENGTH( Modem_Busy       )  > 0 );
  457.             Modem_NoC  := ( POS( Modem_No_Carrier , Modem_Mess ) > 0 ) AND
  458.                           ( LENGTH( Modem_No_Carrier ) > 0 );
  459.             Modem_Conn := ( POS( Modem_Connect    , Modem_Mess ) > 0 ) AND
  460.                           ( LENGTH( Modem_Connect    ) > 0 );
  461.  
  462.             Esc_Hit := FALSE;
  463.  
  464.             IF KeyPressed THEN
  465.                BEGIN
  466.  
  467.                   READ( Kbd, Ch );
  468.  
  469.                   IF Ch = CHR( ESC ) THEN
  470.                      Esc_Hit := TRUE;
  471.  
  472.                   WHILE( KeyPressed ) DO
  473.                      READ( Kbd, Ch );
  474.  
  475.                END
  476.             ELSE
  477.                GiveAwayTime( 2 );
  478.  
  479.          UNTIL ( Dialer_Carrier_Detect ) OR
  480.                ( Timed_Out             ) OR
  481.                ( Modem_Conn            ) OR
  482.                ( Modem_Buzy            ) OR
  483.                ( Modem_NoC             ) OR
  484.                ( Esc_Hit               );
  485.  
  486.          CursorOn;
  487.  
  488.          TextColor( Menu_Text_Color_2 );
  489.  
  490.          IF ( Modem_Conn OR Dialer_Carrier_Detect ) THEN
  491.             Connection_Made := TRUE
  492.          ELSE IF Esc_Hit THEN
  493.             BEGIN
  494.  
  495.                GoToXY( 1 , 6 );
  496.  
  497.                WRITE('*** ESC Pressed, Dialing Cancelled.');
  498.                ClrEol;
  499.  
  500.                Write_Log('ESC Pressed, Dialing Cancelled.' , TRUE , FALSE );
  501.  
  502.                Quit := TRUE;
  503.                                    (* Hang up the phone *)
  504.                HangUpPhone;
  505.  
  506.             END
  507.          ELSE IF Timed_Out THEN
  508.             BEGIN
  509.  
  510.                GoToXY( 1 , 6 );
  511.                WRITE('*** Modem Timed Out, Dialing Cancelled.');
  512.                ClrEol;
  513.  
  514.                Write_Log('Modem Timed Out, Dialing Cancelled.' , TRUE , FALSE );
  515.  
  516.                DELAY( One_Second_Delay );
  517.  
  518.             END
  519.          ELSE IF Modem_Buzy THEN
  520.             BEGIN
  521.  
  522.                GoToXY( 1 , 6 );
  523.  
  524.                WRITE('*** Line Busy.');
  525.                ClrEol;
  526.  
  527.                Write_Log('Line Busy.' , TRUE , FALSE );
  528.  
  529.                                    (* Hang up the phone *)
  530.                HangUpPhone;
  531.  
  532.                DELAY( One_Second_Delay );
  533.  
  534.             END
  535.          ELSE IF Modem_NoC THEN
  536.             BEGIN
  537.  
  538.                GoToXY( 1 , 6 );
  539.  
  540.                WRITE('*** No Answer.');
  541.                ClrEol;
  542.  
  543.                Write_Log('No Answer.' , TRUE , FALSE );
  544.  
  545.                                    (* Hang up the phone *)
  546.                HangUpPhone;
  547.  
  548.                DELAY( One_Second_Delay );
  549.  
  550.             END;
  551.  
  552.       END  (* Phone number gotten *);
  553.  
  554.    TextColor( Menu_Text_Color );
  555.  
  556.    IF ( Connection_Made AND ( NOT Quit ) ) THEN
  557.       BEGIN  (* Connection made *)
  558.  
  559.                                    (* Alter baud rate if modem signals it *)
  560.  
  561.          IF ( Alter_Baud_Rate AND ( LENGTH( Modem_Connect ) > 0 ) ) THEN
  562.             Do_Baud_Detection;
  563.  
  564.          Restore_Screen( Local_Save_5 );
  565.          Reset_Global_Colors;
  566.  
  567.          ConMess := 'Connection established at ' + IToS( Baud_Rate ) +
  568.                     ',' + Parity + ',' + IToS( Data_Bits ) + ',' +
  569.                     IToS( Stop_Bits );
  570.  
  571.          WRITELN;
  572.          Write_Log( ConMess, TRUE , TRUE );
  573.  
  574.                                    (* Remove this number from list, if any *)
  575.  
  576.          IF ( N_Dial_Nos > 0 ) THEN
  577.             BEGIN
  578.                FOR I := ( I_Dial_Nos + 1 ) TO N_Dial_Nos DO
  579.                   Dial_Nos[I-1] := Dial_Nos[I];
  580.                N_Dial_Nos := N_Dial_Nos - 1;
  581.             END;
  582.                                    (* Reset other stuff like script, etc. *)
  583.  
  584.          IF ( Phone_Entry_Number > 0 ) THEN
  585.             Reset_Other_Params( Phone_Entry_Data , Phone_Entry_Number );
  586.  
  587.       END (* Connection made *);
  588.  
  589. END   (* Perform_The_Dial *);
  590.  
  591. (*----------------------------------------------------------------------*)
  592.  
  593. BEGIN (* Dial_A_Number *)
  594.  
  595.    Manual_Dial := FALSE;
  596.    Quit        := FALSE;
  597.    Got_Num     := FALSE;
  598.  
  599.    OK_Redial := ( Re_Dial AND ( ( Phone_Number <> '' ) OR
  600.                                 ( N_Dial_Nos    > 0  ) ) );
  601.  
  602.    IF OK_Redial THEN
  603.       Dial_Title := 'Redialing'
  604.    ELSE
  605.       Dial_Title := 'Dialing';
  606.  
  607.    Save_Partial_Screen( Local_Save_5, 1, 1, Max_Screen_Col, 24 );
  608.  
  609.    IF ( NOT OK_Redial ) (* AND ( N_Dial_Nos <= 0 ) *) THEN
  610.       BEGIN  (* Not a redial *)
  611.  
  612.                                    (* No dialing string given -- display *)
  613.                                    (* directory.                         *)
  614.  
  615.          IF LENGTH( Dialing_String ) = 0 THEN
  616.             BEGIN
  617.  
  618.                Display_Phone_Numbers( Entry_String, Phone_Number,
  619.                                       Prefix_Str, Postfix_Str, Quit );
  620.  
  621.                IF Dialer_Carrier_Detect OR Quit OR ReDial AND
  622.                   ( ( LENGTH( Phone_Number ) = 0 ) AND
  623.                     ( N_Dial_Nos = 0             )     ) THEN
  624.                   BEGIN
  625.                      Restore_Screen( Local_Save_5 );
  626.                      Reset_Global_Colors;
  627.                      EXIT;
  628.                   END
  629.                ELSE
  630.                   Got_Num := TRUE;
  631.  
  632.             END
  633.          ELSE                      (* Dialing string provided *)
  634.             BEGIN
  635.                SNumber     := Dialing_String;
  636.                Prefix_Str  := '';
  637.                Postfix_Str := '';
  638.                FOR I := 1 TO 25 DO
  639.                   Phone_Entry_Data.Phone_Name[I] := ' ';
  640.             END;
  641.  
  642.          IF ( NOT Quit ) THEN
  643.             IF ( NOT Got_Num ) THEN
  644.                Convert_Entry_To_Number;
  645.  
  646.       END  (* Not a redial *);
  647.  
  648. {--------Removed the following check
  649.    IF ( Dialer_Carrier_Detect AND ( NOT Quit ) ) THEN
  650.       BEGIN
  651.          Save_Partial_Screen( Local_Save_3, 10, 5, 60, 8 );
  652.          Draw_Menu_Frame( 10, 5, 60, 8, Menu_Frame_Color, Menu_Title_Color,
  653.                           Menu_Text_Color + Blink, '' );
  654.          WRITE('Session already in progress, dialing cancelled.');
  655.          DELAY( Two_Second_Delay );
  656.          Restore_Screen( Local_Save_3 );
  657.          Reset_Global_Colors;
  658.          Restore_Screen( Local_Save_5 );
  659.          Reset_Global_Colors;
  660.          EXIT;
  661.       END;
  662. -----------}
  663.                                    (* Do actual dialing *)
  664.  
  665.    IF ( N_Dial_Nos = 0 ) (* OR ( NOT OK_Redial ) *) THEN
  666.  
  667.                                    (* Single entry *)
  668.       Perform_The_Dial
  669.    ELSE
  670.       REPEAT
  671.                                    (* Get next # in dialing list *)
  672.  
  673.          IF ( I_Dial_Nos >= 0 ) THEN
  674.             BEGIN
  675.                I_Dial_Nos := I_Dial_Nos + 1;
  676.                IF ( I_Dial_Nos > N_Dial_Nos ) THEN
  677.                   I_Dial_Nos := 1;
  678.             END
  679.          ELSE
  680.             I_Dial_Nos := (-I_Dial_Nos);
  681.  
  682.          SNumber      := Dial_Nos[I_Dial_Nos].Number;
  683.          Redial_Count := Dial_Nos[I_Dial_Nos].Tries;
  684.          OK_Redial    := ( Redial_Count > 0 );
  685.          Manual_Dial  := FALSE;
  686.          Dial_Title   := 'Dialing';
  687.          Prefix_Str   := '';
  688.          Postfix_Str  := '';
  689.                                    (* Convert to dialable form *)
  690.          Convert_Entry_To_Number;
  691.                                    (* Evict any dialing return *)
  692.          Async_Purge_Buffer;
  693.                                    (* Do the dialing           *)
  694.          Perform_The_Dial;
  695.  
  696.          Dial_Nos[I_Dial_Nos].Tries := SUCC( Dial_Nos[I_Dial_Nos].Tries );
  697.  
  698.          IF ( NOT Connection_Made ) AND Script_File_Mode THEN
  699.             Quit := TRUE;
  700.  
  701.       UNTIL ( Connection_Made OR Quit OR ESC_Hit );
  702.  
  703.                                    (* Restore previous screen *)
  704.                                    (* if not connected        *)
  705.  
  706.    IF ( NOT Connection_Made ) THEN
  707.       BEGIN
  708.          Restore_Screen( Local_Save_5 );
  709.          Reset_Global_Colors;
  710.       END
  711.    ELSE
  712.       IF ( N_Dial_Nos > 0 ) THEN
  713.          Signal_Connection;
  714.                                    (* Make sure phone hung up *)
  715.                                    (* if unsuccessful dial    *)
  716.    IF Quit THEN
  717.       HangUpPhone;
  718.  
  719. END   (* Dial_A_Number *);
  720.  
  721. (*----------------------------------------------------------------------*)
  722. (*          Handle_Redial --- Handle Redial after dialing attempt made  *)
  723. (*----------------------------------------------------------------------*)
  724.  
  725. PROCEDURE Handle_Redial( VAR MDelay : REAL;
  726.                          VAR Done   : BOOLEAN );
  727.  
  728. (*----------------------------------------------------------------------*)
  729. (*                                                                      *)
  730. (*     Procedure:  Handle_Redial                                        *)
  731. (*                                                                      *)
  732. (*     Purpose:    Handles redial after dialing attempt made.           *)
  733. (*                                                                      *)
  734. (*     Calling Sequence:                                                *)
  735. (*                                                                      *)
  736. (*        Handle_Redial( VAR MDelay : REAL; VAR Done : BOOLEAN );       *)
  737. (*                                                                      *)
  738. (*           MDelay --- Initial redial delay time                       *)
  739. (*           Done   --- TRUE if redial attempt successful               *)
  740. (*                                                                      *)
  741. (*     Calls:                                                           *)
  742. (*                                                                      *)
  743. (*        TimeOfDay                                                     *)
  744. (*        TimeDiff                                                      *)
  745. (*        Dialer_Carrier_Detect                                         *)
  746. (*        Clear_Window                                                  *)
  747. (*                                                                      *)
  748. (*----------------------------------------------------------------------*)
  749.  
  750. VAR
  751.    RTimer       : REAL;
  752.    DTimer       : REAL;
  753.    PTimer       : REAL;
  754.    OTimer       : REAL;
  755.    Rchar        : CHAR;
  756.    MDnew        : INTEGER;
  757.    Ypos         : INTEGER;
  758.    Local_Save_5 : Saved_Screen_Ptr;
  759.    Redial_Name  : AnyStr;
  760.    Ring_Detect  : BOOLEAN;
  761.  
  762. BEGIN (* Handle_Redial *)
  763.                                    (* If connection established, done *)
  764.    Done        := Connection_Made;
  765.                                    (* Phone shouldn't be ringing now  *)
  766.    Ring_Detect := FALSE;
  767.                                    (* Otherwise, wait for specified   *)
  768.                                    (* modem delay                     *)
  769.    IF ( NOT Done ) THEN
  770.       BEGIN
  771.  
  772.          Redial_Name := TRIM( 'Redialing ' + Phone_Entry_Data.Phone_Name );
  773.  
  774.          Save_Partial_Screen( Local_Save_5, 10, 10, 60, 16 );
  775.          Draw_Menu_Frame( 10, 10, 60, 16, Menu_Frame_Color, Menu_Title_Color,
  776.                           Menu_Text_Color, Redial_Name );
  777.  
  778.          RTimer := TimeOfDay;
  779.  
  780.          Clear_Window;
  781.  
  782.          Ypos := WhereY;
  783.  
  784.          TextColor( Menu_Text_Color_2 );
  785.          WRITE  (' Seconds to next redial: ');
  786.          TextColor( Menu_Text_Color );
  787.          WRITELN( TRUNC( MDelay ) );
  788.  
  789.          TextColor( Menu_Text_Color_2 );
  790.          WRITE  (' R');
  791.          TextColor( Menu_Text_Color );
  792.          WRITE  (' = redial now   ');
  793.          TextColor( Menu_Text_Color_2 );
  794.          WRITE  ('Esc');
  795.          TextColor( Menu_Text_Color );
  796.          WRITE  (' = stop   ');
  797.          TextColor( Menu_Text_Color_2 );
  798.          WRITE  ('C');
  799.          TextColor( Menu_Text_Color );
  800.          WRITE  (' = change delay.');
  801.  
  802.          Rchar  := ' ';
  803.          PTimer := MDelay;
  804.          OTimer := PTimer;
  805.  
  806.          REPEAT
  807.  
  808.             IF PTimer <> OTimer THEN
  809.                BEGIN
  810.                   GoToXY( 26 , YPos );
  811.                   WRITE( TRUNC( PTimer ) );
  812.                   ClrEol;
  813.                   OTimer := PTimer;
  814.                END;
  815.  
  816.             IF KeyPressed THEN
  817.                BEGIN
  818.  
  819.                   READ( Kbd , Rchar );
  820.  
  821.                   IF UpCase( Rchar ) = 'C' THEN
  822.                      BEGIN
  823.                         GotoXY( 1 , 3 );
  824.                         TextColor( Menu_Text_Color_2 );
  825.                         WRITE  (' Enter new delay: ');
  826.                         ClrEol;
  827.                         TextColor( Menu_Text_Color );
  828.                         IF Read_Number( TRUNC( MDelay ), TRUE , MDNew ) THEN
  829.                            MDelay := MDNew;
  830.                         GoToXY( 1 , 3 );
  831.                         ClrEol;
  832.                      END
  833.                   ELSE IF ( Rchar = CHR( ESC ) ) THEN
  834.                      Rchar := 'X';
  835.  
  836.                END
  837.             ELSE
  838.                GiveAwayTime( 2 );
  839.  
  840.             DTimer := TimeDiff( RTimer , TimeOfDay );
  841.             PTimer := MDelay - DTimer;
  842.  
  843.             IF PTimer <= 0.0 THEN
  844.                PTimer := 0.0;
  845.  
  846.             Ring_Detect := Async_Ring_Detect;
  847.  
  848.          UNTIL ( DTimer > MDelay ) OR
  849.                ( Ring_Detect     ) OR
  850.                ( UpCase( Rchar ) IN ['R','X'] );
  851.  
  852.          Done := ( UpCase(Rchar) = 'X' ) OR Ring_Detect;
  853.  
  854.          IF Ring_Detect THEN
  855.             BEGIN
  856.                GoToXY( 1 , 4 );
  857.                TextColor( Menu_Text_Color_2 );
  858.                WRITE('Ring detected, redial stopped.');
  859.                DELAY( Two_Second_Delay );
  860.             END;
  861.  
  862.          Restore_Screen( Local_Save_5 );
  863.          Reset_Global_Colors;
  864.  
  865.       END (* NOT Done *)
  866.    ELSE
  867.       IF ( NOT ( Script_File_Mode OR Read_In_Script ) AND Attended_Mode ) THEN
  868.          Signal_Connection;
  869.  
  870. END   (* Handle_Redial *);
  871.  
  872. (*----------------------------------------------------------------------*)
  873. (*          Redial_A_Number --- Redial last phone number dialed         *)
  874. (*----------------------------------------------------------------------*)
  875.  
  876. PROCEDURE Redial_A_Number;
  877.  
  878. (*----------------------------------------------------------------------*)
  879. (*                                                                      *)
  880. (*     Procedure:  Redial_A_Number                                      *)
  881. (*                                                                      *)
  882. (*     Purpose:    Redials last number dialed (if any).                 *)
  883. (*                                                                      *)
  884. (*     Calling Sequence:                                                *)
  885. (*                                                                      *)
  886. (*        Redial_A_Number;                                              *)
  887. (*                                                                      *)
  888. (*     Calls:                                                           *)
  889. (*                                                                      *)
  890. (*        Dial_A_Number                                                 *)
  891. (*        TimeOfDay                                                     *)
  892. (*        TimeDiff                                                      *)
  893. (*        Dialer_Carrier_Detect                                         *)
  894. (*        Clear_Window                                                  *)
  895. (*        Handle_Redial                                                 *)
  896. (*                                                                      *)
  897. (*----------------------------------------------------------------------*)
  898.  
  899. VAR
  900.    Done         : BOOLEAN;
  901.    Quit         : BOOLEAN;
  902.    MDelay       : REAL;
  903.  
  904. BEGIN (* Redial_A_Number *)
  905.                                    (* Only redial if no current session *)
  906.  
  907.    Done         := Dialer_Carrier_Detect OR ( Phone_Number = '' );
  908.    MDelay       := Modem_Redial_Delay;
  909.    Redial_Count := 0;
  910.  
  911.    WHILE( NOT ( Done OR Connection_Made ) ) DO
  912.       BEGIN
  913.                                    (* Increment redial  *)
  914.  
  915.          Redial_Count := Redial_Count + 1;
  916.  
  917.                                    (* Redial the number *)
  918.  
  919.          Dial_A_Number( TRUE , Quit );
  920.  
  921.                                    (* Handle connection if any *)
  922.  
  923.          Handle_Redial( MDelay , Done );
  924.  
  925.       END (* NOT ( Done OR Connection_Made ) *);
  926.  
  927. END   (* Redial_A_Number *);
  928.  
  929. (*------------------------- PIBDIALER --------------------------------*)
  930.  
  931. BEGIN (* PibDialer *)
  932.                                    (* Initialize error handler. *)
  933.    ErrorPtr := OFS( Trap_Error );
  934.                                    (* Choose prompt style            *)
  935.  
  936.    Use_Short_Prompt   := Use_Short_Dial_Menu;
  937.    Dial_Search_String := '';
  938.    Connection_Made    := FALSE;
  939.  
  940.                                    (* Choose regular dial or re-dial *)
  941.    CASE ReDial OF
  942.  
  943.       FALSE:  REPEAT
  944.                  Redial_Count        := 0;
  945.                  First_Display_Time  := TRUE;
  946.                  Dial_A_Number( FALSE , Quit );
  947.                  Quit := Quit OR Script_File_Mode;
  948.                  IF ( ReDial AND ( NOT Quit ) ) THEN
  949.                     BEGIN
  950.                        ReDial_A_Number;
  951.                        Redial := FALSE;
  952.                     END;
  953.               UNTIL ( Connection_Made OR Quit );
  954.  
  955.       TRUE:   BEGIN
  956.                  First_Display_Time  := TRUE;
  957.                  IF ( N_Dial_Nos > 0 ) THEN
  958.                     Dial_A_Number( TRUE , Quit )
  959.                  ELSE
  960.                     BEGIN
  961.                        IF ( Phone_Number = '' ) THEN
  962.                           Dial_A_Number( FALSE , Quit );
  963.                        ReDial_A_Number;
  964.                     END;
  965.               END;
  966.  
  967.    END (* CASE *);
  968.                                    (* Reset timer if connection made; *)
  969.                                    (* also make sure no script exec   *)
  970.                                    (* unless carrier detect.          *)
  971.    IF Connection_Made THEN
  972.       Dialing_Start_Time := TimeOfDay
  973.    ELSE
  974.       Read_In_Script := FALSE;
  975.  
  976.    Script_Dialed := Read_In_Script;
  977.  
  978. END   (* PibDialer *);
  979.